package com.letcode.study.simple;

import java.util.Arrays;

/**
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 * 移动零
 * 作者：力扣 (LeetCode)
 * 链接：https://leetcode-cn.com/leetbook/read/all-about-array/x9rh8e/
 * 来源：力扣（LeetCode）
 * @Date 2022/3/20 14:48:24
 * @Author luopeng
 */
public class MoveZeroes {
    public static void main(String[] args) {
        moveZeroes1(new int[]{0, 1, 0, 3, 12});
    }

    /**
     * 将所有的非0数往左移动，移动完成后将剩下的其他数补0
     * 用一个index来标识当前该将非0的数移动到数组对应的索引
     * @param nums
     */
    public static void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0) {
            return;
        }
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[index++] = nums[i];
            }
        }
        while (index < nums.length) {
            nums[index++] = 0;
        }
        System.out.println(Arrays.toString(nums));
    }

    /**
     * 交换位置，如果是0不执行操作，否则和第一个是0的数交换位置
     * @param nums
     */
    public static void moveZeroes1(int[] nums) {
        // 定义第0个数
        int start = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                // 和第一个为0的数交换位置
                int temp = nums[start];
                nums[start++] = nums[i];
                nums[i] = temp;
            }
        }
        System.out.println(Arrays.toString(nums));
    }
}
